package code

import (
	"ginweb-admin/commons/response"
	"github.com/gin-gonic/gin"
	"github.com/mojocn/base64Captcha"
	"net/http"
)

type CodeApi struct{}

// 验证码需要的全局参数
var store = base64Captcha.DefaultMemStore     // 验证码的存储器
var driver = base64Captcha.DefaultDriverDigit // 验证码的类型，默认是数字类型

// 创建验证码的方法
func (api *CodeApi) CreateCode(c *gin.Context) {
	// 生成验证码的长度
	driver.Length = 6
	// 调用NewCaptcha()生成具体的验证码对象
	captcha := base64Captcha.NewCaptcha(driver, store)
	// 调用Generate()生成具体的验证码图片地址和id和验证码
	id, baseURl, code, err := captcha.Generate()
	if err != nil {
		response.Fail(40001, "验证生成错误", c)
		return
	}
	// 返回成功的验证码id和code
	response.Ok(map[string]any{"id": id, "baseURL": baseURl, "answer": code}, c)
	// c.JSON(http.StatusOK, gin.H{"id": id, "baseURL": baseURl, "answer": code})
	// c.JSON(http.StatusOK, gin.H{"id": id, "code": code})
}

// 封装校验验证码的犯法
func VerifyCode(id string, code string) bool {
	// true 代表不管成功或者失败，只能校验一次，检验过后就失效
	verify := store.Verify(id, code, true)
	return verify
}

// 测试校验验证码的方法
func (api *CodeApi) VerifyCode(c *gin.Context) {
	// 请求验证码参数的结构体
	type Resquest struct {
		Id   string `form:"id"`
		Code string `form:"code"`
	}
	// 实例化结构体
	resquest := Resquest{}
	// 获取验证码的参数id和code
	err := c.ShouldBindQuery(&resquest)
	if err != nil {
		response.FailWithMessage("验证码参数绑定失败", c)
	}
	// 验证码校验
	// true 代表不管成功或者失败，只能校验一次，检验过后就失效
	verify := store.Verify(resquest.Id, resquest.Code, true)
	if verify {
		c.JSON(http.StatusOK, gin.H{"code": 0, "msg": "验证码校验成功"})
	} else {
		c.JSON(http.StatusOK, gin.H{"code": -1, "msg": "验证码校验失败"})
	}
}
